home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / dll / main.c < prev    next >
C/C++ Source or Header  |  2004-07-01  |  4KB  |  175 lines

  1. /*-------------------------------------------------------------
  2.   main.c : entry point of tcdll.tclock,
  3.            API functions, and hook procedure
  4.   (C) 1997-2003 Kazuto Sato
  5.   Please read readme.txt about the license.
  6.   
  7.   Written by Kazubon, Nanashi-san
  8. ---------------------------------------------------------------*/
  9.  
  10. #include "tcdll.h"
  11.  
  12. /* Globals */
  13.  
  14. /* APIs of tcdll.tclock */
  15. BOOL WINAPI HookStart(HWND hwnd);
  16. void WINAPI HookEnd(void);
  17. void WINAPI GetTClockVersion(char* dst);
  18.  
  19. /* shared data among processes */
  20. #ifdef _MSC_VER
  21. #pragma data_seg("MYDATA")
  22. HHOOK g_hhook = NULL;
  23. HWND  g_hwndTClockMain = NULL;
  24. HWND  g_hwndClock = NULL;
  25. #pragma data_seg()
  26. #endif
  27.  
  28. /* Statics */
  29. LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
  30.  
  31. static void Debug_ListChild(HWND hwndParent, int depth);
  32.  
  33. /*------------------------------------------------
  34.   entry point of this DLL
  35. --------------------------------------------------*/
  36. #ifdef NODEFAULTLIB
  37.  
  38. #ifdef __BORLANDC__
  39. #define _DllMainCRTStartup DllEntryPoint
  40. #endif
  41.  
  42. BOOL WINAPI _DllMainCRTStartup(HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
  43. #else
  44. int WINAPI DllMain(HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
  45. #endif
  46. {
  47.     return TRUE;
  48. }
  49.  
  50. /*------------------------------------------------
  51.   API: install my hook
  52.   this function is called in tclock.exe process
  53. --------------------------------------------------*/
  54. BOOL WINAPI HookStart(HWND hwndMain)
  55. {
  56.     HWND hwndTaskbar, hwndTray;
  57.     DWORD idThread;
  58.     
  59.     g_hwndTClockMain = hwndMain;
  60.     
  61.     g_hInst = GetModuleHandle(DLLFILENAME);
  62.     
  63.     // find the taskbar
  64.     hwndTaskbar = GetTaskbarWindow();
  65.     if(!hwndTaskbar)
  66.     {
  67.         SendMessage(hwndMain, TCM_CLOCKERROR, 0, 1);
  68.         return FALSE;
  69.     }
  70.     // find the clock window
  71.     hwndTray = FindWindowEx(hwndTaskbar, NULL, "TrayNotifyWnd", "");
  72.     if(!hwndTray)
  73.     {
  74.         SendMessage(hwndMain, TCM_CLOCKERROR, 0, 2);
  75.         return FALSE;
  76.     }
  77.     
  78.     g_hwndClock = FindWindowEx(hwndTray, NULL, "TrayClockWClass", NULL);
  79.     if(!g_hwndClock)
  80.     {
  81.         // WriteDebug("Your Taskbar:");
  82.         // Debug_ListChild(hwndTaskbar, 0);
  83.         SendMessage(hwndMain, TCM_CLOCKERROR, 0, 3);
  84.         return FALSE;
  85.     }
  86.     
  87.     // get thread ID of taskbar (explorer)
  88.     // Specal thanks to T.Iwata.
  89.     idThread = GetWindowThreadProcessId(hwndTaskbar, NULL);
  90.     if(!idThread)
  91.     {
  92.         SendMessage(hwndMain, TCM_CLOCKERROR, 0, 4);
  93.         return FALSE;
  94.     }
  95.     
  96.     // install an hook to thread of taskbar
  97.     g_hhook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc,
  98.         g_hInst, idThread);
  99.     if(!g_hhook)
  100.     {
  101.         SendMessage(hwndMain, TCM_CLOCKERROR, 0, 5);
  102.         return FALSE;
  103.     }
  104.     
  105.     // refresh taskbar
  106.     PostMessage(hwndTaskbar, WM_SIZE, SIZE_RESTORED, 0);
  107.     
  108.     return TRUE;
  109. }
  110.  
  111. /*------------------------------------------------
  112.   API: uninstall my hook
  113.   this function is called in tclock.exe process
  114. --------------------------------------------------*/
  115. void WINAPI HookEnd(void)
  116. {
  117.     // EndClock() will be called
  118.     if(g_hwndClock && IsWindow(g_hwndClock))
  119.         SendMessage(g_hwndClock, CLOCKM_EXIT, 0, 0);
  120.     
  121.     // uninstall my hook
  122.     if(g_hhook != NULL)
  123.         UnhookWindowsHookEx(g_hhook);
  124.     g_hhook = NULL;
  125. }
  126.  
  127. /*------------------------------------------------
  128.   API: return this version
  129. --------------------------------------------------*/
  130. void WINAPI GetTClockVersion(char* dst)
  131. {
  132.     if(dst) strcpy(dst, TCLOCKVERSION);
  133. }
  134.  
  135. /*---------------------------------------------------------
  136.   hook procedure
  137.   this function is called in explorer.exe process
  138. ----------------------------------------------------------*/
  139. LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
  140. {
  141.     LPCWPSTRUCT pcwps = (LPCWPSTRUCT)lParam;
  142.     
  143.     if(nCode == HC_ACTION && pcwps && pcwps->hwnd)
  144.     {
  145.         if(!g_bInitClock && pcwps->hwnd == g_hwndClock)
  146.         {
  147.             InitClock(pcwps->hwnd); // main2.c
  148.         }
  149.     }
  150.     return CallNextHookEx(g_hhook, nCode, wParam, lParam);
  151. }
  152.  
  153. /*---------------------------------------------------------
  154.   for Debug
  155. ----------------------------------------------------------*/
  156. void Debug_ListChild(HWND hwndParent, int depth)
  157. {
  158.     HWND hwnd;
  159.     char classname[80];
  160.     int i;
  161.     
  162.     for(i = 0; i < depth && i < 79; i++) classname[i] = '+';
  163.     classname[i] = 0;
  164.     GetClassName(hwndParent, classname + i, 80 - i);
  165.     WriteDebug(classname);
  166.     
  167.     hwnd = GetWindow(hwndParent, GW_CHILD);
  168.     while(hwnd)
  169.     {
  170.         Debug_ListChild(hwnd, depth + 1);
  171.         hwnd = GetWindow(hwnd, GW_HWNDNEXT);
  172.     }
  173. }
  174.  
  175.